﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Web;
using com.fukefu.source;

namespace com.fukefu
{
    public static class MyFunction
    {
        static Random random = new Random();
        static string[] xing = new string[] { "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎", "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常", "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "粱", "杜", "阮", "蓝", "闵", "席", "季", "麻", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭", "梅", "盛", "林", "刁", "钟", "徐", "邱", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍", "虞", "万", "支", "柯", "咎", "管", "卢", "莫", "经", "房", "裘", "缪", "干", "解", "应", "宗", "宣", "丁", "贲", "邓", "郁", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉", "钮", "龚", "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀", "羊", "於", "惠", "甄", "麴", "加", "封", "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "弓", "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫", "宁", "仇", "栾", "暴", "甘", "钭", "厉", "戎", "祖", "武", "符", "刘", "景", "詹", "束", "龙", "叶", "幸", "司", "韶", "郜", "黎", "蓟", "薄", "印", "宿", "白", "怀", "蒲", "台", "从", "鄂", "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阴", "鬻", "胥", "能", "苍", "双", "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍", "郤", "璩", "桑", "桂", "濮", "牛", "寿", "通", "边", "扈", "燕", "冀", "郏", "浦", "尚", "农", "温", "别", "庄", "晏", "柴", "瞿", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼", "容", "向", "古", "易", "慎", "戈", "廖", "庚", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘", "匡", "国", "文", "寇", "广", "禄", "阙", "东", "殴", "殳", "沃", "利", "蔚", "越", "夔", "隆", "师", "巩", "厍", "聂", "晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空", "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红", "游", "竺", "权", "逯", "盖", "益", "桓", "公", "万", "俟", "司", "马", "上", "官", "欧", "阳", "夏", "侯", "诸", "葛", "闻", "人", "东", "方", "赫", "连", "皇", "甫", "尉", "迟", "公", "羊", "澹", "台", "公", "冶", "宗", "政", "濮", "阳", "淳", "于", "仲", "孙", "太", "叔", "申", "屠", "公", "孙", "乐", "正", "轩", "辕", "令", "狐", "钟", "离", "闾", "丘", "长", "孙", "慕", "容", "鲜", "于", "宇", "文", "司", "徒", "司", "空", "亓", "官", "司", "寇", "仉", "督", "子", "车", "颛", "孙", "端", "木", "巫", "马", "公", "西", "漆", "雕", "乐", "正", "壤", "驷", "公", "良", "拓", "拔", "夹", "谷", "宰", "父", "谷", "粱", "晋", "楚", "闫", "法", "汝", "鄢", "涂", "钦", "段", "干", "百", "里", "东", "郭", "南", "门", "呼", "延", "妫", "海", "羊", "舌", "微", "生", "岳", "帅", "缑", "亢", "况", "後", "有", "琴", "梁", "丘", "左", "丘", "东", "门", "西", "门", "商", "牟", "佘", "佴", "伯", "赏", "南", "宫", "墨", "哈", "谯", "笪", "年", "爱", "阳", "佟", "第", "五", "言", "福", "百", "家", "姓", "续" };
        //base64编码
        public static string Base64Code(string Message)
        {
            byte[] bytes = Encoding.Default.GetBytes(Message);
            return Convert.ToBase64String(bytes);
        }
        //base64解码
        public static string Base64Decode(string Message)
        {
            byte[] bytes = Convert.FromBase64String(Message);
            return Encoding.Default.GetString(bytes);
        }
        //hash加密
        public static string HashCode(string Message)
        {
            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(Message, "SHA1").ToLower();
        }
        //生成一定数量的不相同的随机数
        public static int[] GetDifferentRandomNum(int size, int result_count)
        {
            //如果数组太小，返回空结果
            if (size < result_count)
            {
                return null;
            }
            int[] result = new int[result_count];
            //随即数组
            List<int> list = new List<int>();
            for (int i = 0; i < size; i++)
            {
                list.Add(i);
            }
            int j = 0;
            for (int i = 0; i < result_count; i++)
            {
                j = random.Next(list.Count);
                result[i] = list[j];
                list.RemoveAt(j);
            }
            return result;
        }
        //获取url中的关键字
        public static string FindkeywordBySpiderUrl(string url)
        {
            url = ExplainUrl(url);
            //舍弃百度缓存还有谷歌缓存的路径
            if (url.IndexOf("http://cache.baidu.com") != -1 || url.IndexOf("http://webcache.googleusercontent.com") != -1 || url.IndexOf("http://p.mm.cn.yahoo.com") != -1)
            {
                return "";
            }
            string word = "";
            //百度手机来源特殊处理
            if (Regex.IsMatch(url, "(m|wap).baidu.com") && Regex.IsMatch(url, "/(t|ssid)="))
            {
                Match mc = Regex.Match(url, "/w=[0-9]+_[0-9]+_([^/]+)/t?");
                word = DecodeURL(mc.Groups[1].Value.ToString()).Trim();
            }
            else
            {
                MatchCollection mc = Regex.Matches(url, "[\\?&;^/](keyword|query|w|key_word|kw|searchkey|p|q|wd|keyword|word|k)=([^&^\\?]+)");
                int page = 0;
                while (mc.Count > page && Regex.IsMatch(word, "^[0-9a-z]*$"))
                {
                    GroupCollection gc = mc[page].Groups;
                    word = DecodeURL(mc[page].Groups[2].Value.ToString()).Trim();
                    page++;
                }
            }
            return word.Replace("\0", "");
        }
        //获取搜索引擎中的前关键字
        public static string FindKeywordBySpiderUrlBefore(string url)
        {
            url = ExplainUrl(url);
            Match mc = Regex.Match(url, "[\\?&;^/](bs)=([^&^\\?]+)");
            if (mc.Length > 0)
            {
                return DecodeURL(mc.Groups[2].Value.ToString()).Trim().Replace("\0", "");
            }
            return "";
        }
        //url解码
        public static string DecodeURL(string url)
        {
            string str;
            if (url.IndexOf("%") != -1)
            {
                if (IsUtf8(url))
                {
                    str = HttpUtility.UrlDecode(url, Encoding.UTF8);
                }
                else
                {
                    str = HttpUtility.UrlDecode(url, Encoding.GetEncoding("gb2312"));
                }
            }
            else
            {
                Byte[] bytes = Encoding.GetEncoding("gb2312").GetBytes(url);
                str = BytesToString(bytes);
            }
            //判断字符串中是不是有中文乱码
            foreach (char c in str)
            {
                //是乱码的东东
                if ((int)c == 65533 || (int)c == 58855)
                {
                    return "";
                }
            }
            return str;
        }
        //翻译url中的%,=,?,&
        private static string ExplainUrl(string url)
        {
            url = url.ToLower();
            url = url.ToLower().Replace("%25", "%").Replace("%3d", "=").Replace("%3f", "?").Replace("%26", "&");
            return url;
        }
        //生成固定电话
        public static string CreateFixedTelephoneNum()
        {
            int len = 6 + random.Next(2);
            string result = (random.Next(8) + 2).ToString();
            for (int i = 0; i < len; i++)
            {
                result += random.Next(10);
            }
            return result;
        }
        //生成随机名字
        public static string CreateName()
        {
            int len = xing.Length;
            return xing[random.Next(len)] + (random.Next(2) == 0 ? "先生" : "女士");
        }
        //生成手机号码
        public static string CreateMobileNum()
        {
            string result = "13";
            for (int i = 0; i < 9; i++)
            {
                result += random.Next(10);
            }
            return result;
        }
        //生成随机密码
        public static string CreatePassword(int len)
        {
            string password = "";
            int id;
            do
            {
                id = random.Next(64) + 48;
                if ((id > 57 && id < 65) || (id > 90 && id < 97))
                {
                    continue;
                }
                password += (char)id;
            } while (password.Length < len);
            return password;
        }
        public static string GetIp()
        {
            string html = new Source().Get("http://pv.sohu.com/cityjson");
            return "IP:" + Regex.Match(html, "\"cip\": \"([^\"]+)\"").Groups[1].Value + " 来自:" + Regex.Match(html, "\"cname\": \"([^\"]+)\"").Groups[1].Value;
        }
        //运行程序
        public static void RunProgram(string path)
        {
            RunProgram(path, "");
        }
        public static void RunProgram(string path, string arguments)
        {
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.UseShellExecute = true;
            p.StartInfo.FileName = path;
            p.StartInfo.Arguments = arguments;
            p.Start();
        }
        //提取主机名 表达式:(http://|/)?([^/]+)
        public static string GetHost(string url)
        {
            url = url.Replace("http://", "").Replace("https://", "");
            return Regex.Match(url, "[^/]+").Groups[0].Value.ToLower();
        }
        //提取主域名 表达式:[^\.]+\.(com|gov|net|org|edu|cn|cc|info|tk|tv|name|biz)(\.[^/]+|[^/])?
        public static string GetDomain(string url)
        {
            string domain = GetHost(url) + "/";
            if (Regex.IsMatch(domain, "[^\\.]+\\.(com|gov|net|org|edu|cn|cc|info|tk|tv|name|biz)(\\.cn)?/"))
            {
                return Regex.Match(domain, "[^\\.]+\\.(com|gov|net|org|edu|cn|cc|info|tk|tv|name|biz)(\\.cn)?(:[0-9]+)?/").Groups[0].Value.Replace("/", "");
            }
            else
            {
                return domain.Substring(0, domain.IndexOf("/"));
            }
        }
        //递归文件夹所有文件
        public static List<string> GetFileInfoes(string path)
        {
            return GetFileInfoes(path, new List<string>());
        }
        private static List<string> GetFileInfoes(string path, List<string> list)
        {
            //判断文件是不是存在
            if (Directory.Exists(path))
            {
                //查看文件件中的所有目录
                DirectoryInfo[] dir = new DirectoryInfo(path).GetDirectories();
                foreach (DirectoryInfo d in dir)
                {
                    GetFileInfoes(d.FullName, list);
                }
                //查看文件中的所有文件
                FileInfo[] files = new DirectoryInfo(path).GetFiles();
                foreach (FileInfo f in files)
                {
                    list.Add(f.FullName);
                }
            }
            return list;
        }
        //获得主机IP地址
        public static string GetHostIP()
        {
            return (Dns.GetHostEntry(Dns.GetHostName()).AddressList)[0].ToString();
        }
        //32位小写md5
        public static string Md5(string str)
        {
            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "md5").ToLower();
        }
        //16位小写md5
        public static string Md5_16(string str)
        {
            return Md5(str).Substring(8, 16);
        }
        //数据流转换成字符串
        public static string StreamToString(Stream stream)
        {
            byte[] buff = StreamToBytes(stream);
            return Encoding.GetEncoding(CheckByteEncoder(buff)).GetString(buff);
        }
        //将 Stream 写入文件
        public static void StreamToFile(Stream stream, string path)
        {
            if (stream == null)
            {
                return;
            }
            int len;
            byte[] buff = new byte[2048];
            // 把 byte[] 写入文件 
            FileStream fs = new FileStream(path, FileMode.Create);
            BinaryWriter bw = new BinaryWriter(fs);
            while ((len = stream.Read(buff, 0, 2048)) > 0)
            {
                bw.Write(buff, 0, len);
            }
            bw.Close();
            fs.Close();
        }
        //字符传转换成byte[]数组
        public static byte[] StringtoByte(string str)
        {
            return Encoding.ASCII.GetBytes(str);
        }
        //unicode转码
        public static string Uncode(string str)
        {
            string outStr = "";
            str = str.Replace("%25", "%").Replace("%u", "\\u");
            outStr = new Regex(@"(?i)\\u([0-9a-f]{4})").Replace(str, delegate(Match m1)
            {
                return ((char)Convert.ToInt32(m1.Groups[1].Value, 16)).ToString();
            });
            return outStr;
        }
        //unicode编码码
        public static string Encode(string str)
        {
            return HttpUtility.UrlEncodeUnicode(str);
        }
        //现在时间13位时间戳
        public static long GetTimestampNow()
        {
            return GetTimestamp(DateTime.Now);
        }
        //现在时间10位时间戳
        public static long GetTimestampNow2()
        {
            return GetTimestamp(DateTime.Now) / 1000;
        }
        //13位时间戳
        public static long GetTimestamp(System.DateTime time)
        {
            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));
            return (time.Ticks - startTime.Ticks) / 10000;            //除10000调整为13位
        }
        //gbk编码
        public static string EncodeByGBK(string word)
        {
            return HttpUtility.UrlEncode(word, Encoding.GetEncoding("gbk"));
        }
        //gbk解码
        public static string DecodeByGBK(string word)
        {
            return HttpUtility.UrlDecode(word, Encoding.GetEncoding("gbk"));
        }
        //2312编码
        public static string EncodeByGb2312(string word)
        {
            return HttpUtility.UrlEncode(word, Encoding.GetEncoding("gb2312"));
        }
        //utf-8编码
        public static string EncodeByUtf8(string word)
        {
            return HttpUtility.UrlEncode(word);
        }
        //字符换转换成byte[]
        public static byte[] GetBytes(string str, string encode)
        {
            return Encoding.GetEncoding(encode).GetBytes(str);
        }
        //识别字符串编码
        private static string CheckByteEncoder(byte[] buff)
        {
            string bianma = "utf-8";
            //识别编码
            int currentId = 0;
            for (int i = 0; i < buff.Length; )
            {
                if (buff[i] > 223 && buff[i] < 240)
                {
                    i += 3;
                    currentId++;
                    if (currentId == 20)
                    {
                        break;
                    }
                    continue;
                }
                else if (buff[i] > 159)
                {
                    bianma = "gb2312";
                    break;
                }
                i++;
            }
            return bianma;
        }
        //数据流写入bytes
        public static byte[] StreamToBytes(Stream stream)
        {
            try
            {
                //读入内存
                MemoryStream temp = new MemoryStream();
                int len = 0;
                byte[] buff = new byte[2048];
                while ((len = stream.Read(buff, 0, 2048)) > 0)
                {
                    temp.Write(buff, 0, len);
                }
                //归位,转数组
                temp.Seek(0, SeekOrigin.Begin);
                byte[] PageBytes = new byte[temp.Length];
                temp.Read(PageBytes, 0, PageBytes.Length);
                temp.Close();
                stream.Close();
                return PageBytes;
            }
            catch (Exception e)
            {
                Log.GetInstance().Write(e.Message + "(MyFunction)");
                return new byte[0];
            }
        }
        //文件转换成byte[]
        public static byte[] FileToBytes(string fileName)
        {
            // 把 byte[] 写入文件 
            FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            byte[] buff = new byte[fs.Length];
            fs.Read(buff, 0, (int)fs.Length);
            fs.Close();
            return buff;
        }
        //文件转换成字符串
        public static string FileToString(string fileName)
        {
            // 把 byte[] 写入文件 
            FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            byte[] buff = new byte[fs.Length];
            fs.Read(buff, 0, (int)fs.Length);
            fs.Close();
            return BytesToString(buff);
        }
        //从文件读取 MemoryStream
        private static Stream FileToMemoryStream(string fileName)
        {
            // 打开文件 
            FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
            // 读取文件的 byte[] 
            byte[] bytes = new byte[fileStream.Length];
            fileStream.Read(bytes, 0, bytes.Length);
            fileStream.Close();
            // 把 byte[] 转换成 Stream 
            Stream stream = new MemoryStream(bytes);
            return stream;
        }
        //byte[]转换成字符串
        public static string BytesToString(byte[] buff)
        {
            return Encoding.GetEncoding(CheckByteEncoder(buff)).GetString(buff);
        }
        //图片转换成bytes
        public static byte[] ImageToBytes(Image image, ImageFormat f)
        {
            MemoryStream ms = new MemoryStream();
            new Bitmap(image).Save(ms, f);
            return ms.ToArray();
        }
        //byte转换成文件
        public static void BytesToFile(byte[] buff, string path)
        {
            if (buff == null || string.IsNullOrEmpty(path))
            {
                return;
            }
            FileStream fs = new FileStream(path, FileMode.Create);
            fs.Write(buff, 0, buff.Length);
            fs.Close();
        }
        //判断是否是utf-8编码
        private static bool IsUtf8(string url)
        {
            //去除utf-8三个字节的
            if (Regex.IsMatch(url, "%e.%[89ab].%[89ab]."))
            {
                url = Regex.Replace(url.ToLower(), "%e.%[89ab].%[89ab].", "");
                //去除utf-8 2个字节的
                url = Regex.Replace(url.ToLower(), "%[cd].%[89ab].", "");
            }
            //如果不存在url，没有必要判断，直接返回true
            MatchCollection mc = Regex.Matches(url, "%(.)");
            if (mc.Count == 0)
            {
                return true;
            }
            GroupCollection gc;
            foreach (Match m in mc)
            {
                //循环盘点%后面第一个字母
                gc = m.Groups;
                char c = gc[1].Value.ToString()[0];
                if (c < 'a')
                {
                    continue;
                }
                else
                {
                    return false;
                }
            }
            return true;
        }
        public static string ToHtml(string text)
        {
            //增加html标签
            text = "<p>" + text + "</p>";
            text = Regex.Replace(text, "\r\n", "</p><p>");
            text = Regex.Replace(text, "<p>\\s*", "<p>　　");
            return text;
        }
        public static string ToText(string html)
        {
            return ToText(html, 0);
        }
        public static string ToText(string html, int id)
        {
            html = Regex.Replace(html, "&[a-z]+;", "", RegexOptions.IgnoreCase);
            //换行符号
            html = Regex.Replace(html, "<div>", "<p>");
            html = Regex.Replace(html, "</div>", "</p>");
            html = Regex.Replace(html, "<br.*?>", "#tag#", RegexOptions.IgnoreCase);
            html = Regex.Replace(html, "<p>", "#tag#", RegexOptions.IgnoreCase);
            html = Regex.Replace(html, "</p>", "#tag#", RegexOptions.IgnoreCase);
            html = Regex.Replace(html, "\r\n", "");
            html = Regex.Replace(html, "#tag#(\\s*<[^>]+>)+#tag#", "#tag#", RegexOptions.IgnoreCase);
            html = Regex.Replace(html, "\\s*(<[^>]+>)\\s*", "$1");
            //删除html标记
            if (id == 0)
            {
                html = Regex.Replace(html, "</?[^>]+>", "", RegexOptions.IgnoreCase);
            }
            //删除多余空行和开头结尾的标注
            html = Regex.Replace(html, "#tag#(\\s*#tag#)+", "#tag##tag#");
            html = Regex.Replace(html, "^\\s*(#tag#\\s*)+", "");
            html = Regex.Replace(html, "(#tag#\\s*)+$", "");
            //回转
            html = Regex.Replace(html, "#tag#", "\r\n");
            return html;
        }
        //程序休息
        public static void Sleep(double time)
        {
            Thread.Sleep(Convert.ToInt32(time * 1000));
        }
        //生成随机数
        public static int GetRandom(int num)
        {
            return random.Next(num);
        }
    }
}
